package com.isoft.c2team3service2.config;

import cn.hutool.core.util.StrUtil;
import com.isoft.c2team3service2.entity.UserDTO;
import com.isoft.c2team3service2.util.UserHolder;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.Map;
import java.util.concurrent.TimeUnit;

public class LoginInterceptor implements HandlerInterceptor {

    private final StringRedisTemplate stringRedisTemplate;

    // 必须通过构造器注入StringRedisTemplate（拦截器由Spring手动创建时需显式传入）
    public LoginInterceptor(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1. 处理预检请求（保留）
        if ("OPTIONS".equals(request.getMethod())) {
            return true;
        }

        // 2. 获取并处理Token（保留，确保Token格式正确）
        String token = request.getHeader("Authorization");
        if (token == null || !token.startsWith("Bearer ")) {
            response.setStatus(401);
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write("{\"code\":401,\"message\":\"Token格式错误\"}");
            return false;
        }
        token = token.substring(7);

        // 3. 从Redis查询用户信息（保留）
        String redisKey = "user:login:" + token;
        Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(redisKey);
        if (userMap.isEmpty()) {
            response.setStatus(401);
            response.getWriter().write("{\"code\":401,\"message\":\"Token无效或已过期\"}");
            return false;
        }

        // 4. 修复核心：字段转换时增加“null+空字符串”校验
        UserDTO userDTO = new UserDTO();

        // 处理id字段（必传，若为空直接返回错误）
        String idStr = userMap.get("id") != null ? userMap.get("id").toString().trim() : "";
        if (StrUtil.isBlank(idStr)) { // 使用Hutool的StrUtil，或手动判断：idStr == null || idStr.isEmpty()
            response.setStatus(500);
            response.getWriter().write("{\"code\":500,\"message\":\"用户ID无效\"}");
            return false;
        }
        userDTO.setId(Integer.parseInt(idStr));

        // 处理userType字段（可选，为空则设为null）
        String userTypeStr = userMap.get("userType") != null ? userMap.get("userType").toString().trim() : "";
        userDTO.setUserType(StrUtil.isNotBlank(userTypeStr) ? Integer.parseInt(userTypeStr) : null);

        // 处理artistId字段（可选，为空则设为null）
        String artistIdStr = userMap.get("artistId") != null ? userMap.get("artistId").toString().trim() : "";
        userDTO.setArtistId(StrUtil.isNotBlank(artistIdStr) ? Integer.parseInt(artistIdStr) : null);

        // 处理其他字符串字段（如username、nickName，避免空字符串）
        userDTO.setUsername(userMap.get("username") != null ? userMap.get("username").toString().trim() : "");
        userDTO.setNickName(userMap.get("nickName") != null ? userMap.get("nickName").toString().trim() : "");

        // 5. 存入UserHolder并刷新Token（保留）
        UserHolder.saveUser(userDTO);
        stringRedisTemplate.expire(redisKey, 30, TimeUnit.MINUTES);

        return true;
    }}